home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / wb / czesc_3 / mungfriend / source / mungfriend3.1.s < prev   
Text File  |  1997-01-24  |  15KB  |  696 lines

  1. *-----------------------*
  2. *    MungFriend
  3. *    version 3.1 (rev 9)
  4. *    © 1995-97 Szymon Pura
  5. *    KickStart 2.0 required
  6. *-----------------------*
  7.  
  8. ***************************** VERSION HISTORY ******************************
  9. **                                                                        **
  10. **  V2.0    28.2.96    Initial release                                   **
  11. **  V2.1    4.3.96    TYPE & WRITE fixed                                **
  12. **          6.3.96    REMOVE fixed                                      **
  13. **          27.3.96     WRITE fixed                                       **
  14. **          9.4.96      Minor fixes                                       **
  15. **          27.5.96     Memory allocation fixed                           **
  16. **  V2.2    26.6.96     NOBELL option added                               **
  17. **  V2.3    17.11.96    FindResNode fixed                                 **
  18. **                      Priority set to 120                               **
  19. **                      KickMemList replaces AllocAbs()'es in InitProc    **
  20. **  V3.0    19.11.96    Totally redone memory allocation                  **
  21. **                      Priority set to 0                                 **
  22. **                      INFO improved                                     **
  23. **  V3.1    24.01.97    TYPE & WRITE improved                             **
  24. **                      Cache cleared                                     **
  25. **                      ROMTag fixed                                      **
  26. **                                                                        **
  27. ****************************************************************************
  28.  
  29.  
  30.     include    EInclude.m
  31.  
  32.     EInclude    DOS,DOS
  33.     EInclude    DOS,DOSEXTENS
  34.     EInclude    DOS,DOS_LIB
  35.     EInclude    EXEC,EXECBASE
  36.     EInclude    EXEC,EXEC_LIB
  37.     EInclude    EXEC,LIBRARIES
  38.     EInclude    EXEC,MEMORY
  39.     EInclude    EXEC,RESIDENT
  40.     EInclude    EXEC,STRINGS
  41.     EInclude    EXEC,TYPES
  42.     EInclude    HARDWARE,CUSTOM
  43.  
  44. MYVERSION    equ    3
  45. MYREVISION    equ    1
  46. custombase    equ    $dff000
  47.  
  48.     ifnd    _LVORawPutChar      * not defined in exec_lib.i
  49. _LVORawPutChar    equ    -516
  50.     endc
  51.  
  52. *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  53.  
  54.     STRUCTURE    MFResidentNode,0
  55.     APTR    mfrn_MyResident
  56.     APTR    mfrn_Succ
  57.     ULONG    mfrn_null    ; end of the array
  58.  
  59.     UWORD    mfrn_Version
  60.     UWORD    mfrn_Revision
  61.     UBYTE    mfrn_Flags
  62.     UBYTE    pad    ; unused at the moment...
  63.  
  64. ; start of Resident structure
  65.  
  66.     STRUCT    mfrn_Resident,RT_SIZE
  67.     STRUCT    mfrn_IDString,60
  68.     STRUCT    mfrn_NameString,12
  69.     STRUCT    mfrn_Reserved,20    ; unused at the moment...
  70.  
  71. ; start of the MemList structure
  72.  
  73.     LABEL    mfrn_MemList
  74.     STRUCT    mfrn_Node,LN_SIZE
  75.     UWORD    mfrn_NumEntries    ; just one entry...
  76.     APTR    mfrn_NodePtr
  77.     ULONG    mfrn_NodeSize
  78.  
  79.     ULONG    mfrn_CharsInBuff
  80.     ULONG    mfrn_BufferSize
  81.  
  82. ; special procs
  83.  
  84.     STRUCT    mfrn_InitProc,50    * only about 30 bytes needed...
  85.     STRUCT    mfrn_PatchProc,200    * only about 130 bytes needed...
  86.     APTR    mfrn_OldVector    * old _LVORawPutChar value
  87.  
  88. ; buffer starts here
  89.  
  90.     LABEL    mfrn_Buffer
  91.     LABEL    mfrn_SIZEOF
  92.  
  93. ; defs for mfrn_Flags
  94.  
  95.     BITDEF    MFRN,FLASH,0
  96.     BITDEF    MFRN,SERIAL,1
  97.     BITDEF    MFRN,TRACE,2
  98.     BITDEF    MFRN,PATCHED,3
  99.     BITDEF    MFRN,OVERFLOW,4
  100.     BITDEF    MFRN,NOBELLS,5
  101.  
  102. ****************************************************************************
  103.  
  104. Start    lea    DosLibName(pc),a1
  105.     moveq    #0,d0
  106.     CALLEXEC    OpenLibrary
  107.     move.l    d0,_DOSBase
  108.     move.l    d0,a6
  109.     JSRL    Input
  110.     move.l    d0,MyInput
  111.     JSRL    Output
  112.     move.l    d0,MyOutput
  113.     move.w    LIB_VERSION(a6),d0
  114.     cmpi.w    #35,d0
  115.     bhi    strt_0
  116.     move.l    a6,a1
  117.     CALLEXEC    CloseLibrary
  118.     moveq    #RETURN_FAIL,d0
  119.     rts
  120. strt_0    lea    MyTemplate(pc),a1
  121.     move.l    a1,d1
  122.     lea    MyArgTable,a2
  123.     move.l    a2,d2
  124.     moveq    #0,d3
  125.     JSRL    ReadArgs
  126.     move.l    d0,ArgPtr
  127.     bne    strt_1
  128.     JSRL    IoErr
  129.     moveq    #0,d2
  130.     JSRL    PrintFault
  131.     movea.l    a6,a1
  132.     CALLEXEC    CloseLibrary
  133.     moveq    #RETURN_FAIL,d0
  134.     rts
  135. strt_1    moveq    #-1,d0
  136.     moveq    #6,d1
  137.     move.l    a2,a0
  138. strt_c    tst.l    (a0)+
  139.     sne    d2
  140.     andi.b    #1,d2
  141.     add.b    d2,d0
  142.     dbf    d1,strt_c
  143.     tst.b    d0
  144.     beq    strt_2
  145.     addq.b    #1,d0
  146.     beq    strt_2
  147.     lea    TooManyCommands(pc),a0
  148. QuitStrErr
  149.     bsr    PrintString
  150. QuitErr    bsr    Quit
  151.     moveq    #RETURN_FAIL,d0
  152.     rts
  153. Quit    move.l    ArgPtr(pc),d1
  154.     CALLDOS    FreeArgs
  155.     move.l    a6,a1
  156.     CALLEXEC    CloseLibrary
  157.     rts
  158. FlagError
  159.     lea    FlagErrorTxt(pc),a0
  160.     bra    QuitStrErr
  161. strt_2    bsr    FindResNode
  162.     move.l    d0,MFNode
  163.     move.l    d0,a3
  164.     move.l    a2,a0
  165.     tst.l    36(a0)
  166.     beq    strt_3
  167.     tst.l    40(a0)
  168.     bne    FlagError
  169. strt_3    tst.l    44(a0)
  170.     beq    strt_4
  171.     tst.l    48(a0)
  172.     bne    FlagError
  173. strt_4    tst.l    52(a0)
  174.     beq    strt_5
  175.     tst.l    56(a0)
  176.     bne    FlagError
  177. strt_5    tst.l    60(a0)
  178.     beq    strt_f
  179.     tst.l    64(a0)
  180.     bne    FlagError
  181. strt_f    tst.l    MFNode
  182.     beq    strt_b
  183.     tst.l    36(a0)
  184.     beq    strt_6
  185.     bset    #MFRNB_FLASH,mfrn_Flags(a3)
  186. strt_6    tst.l    40(a0)
  187.     beq    strt_7
  188.     bclr    #MFRNB_FLASH,mfrn_Flags(a3)
  189. strt_7    tst.l    52(a0)
  190.     beq    strt_8
  191.     bset    #MFRNB_TRACE,mfrn_Flags(a3)
  192.     bset    #MFRNB_PATCHED,mfrn_Flags(a3)
  193.     bne    strt_8
  194.     movem.l    a0/a1/a6,-(sp)
  195.     movea.l    4.w,a6
  196.     lea    mfrn_PatchProc(a3),a0
  197.     move.l    a0,d0
  198.     lea    _LVORawPutChar,a0
  199.     move.l    a6,a1
  200.     JSRL    Disable
  201.     JSRL    SetFunction
  202.     JSRL    Enable
  203.     move.l    d0,mfrn_OldVector(a3)
  204.     movem.l    (sp)+,a0/a1/a6
  205. strt_8    tst.l    56(a0)
  206.     beq    strt_9
  207.     bclr    #MFRNB_TRACE,mfrn_Flags(a3)
  208. strt_9    tst.l    44(a0)
  209.     beq    strt_a
  210.     bset    #MFRNB_SERIAL,mfrn_Flags(a3)
  211. strt_a    tst.l    48(a0)
  212.     beq    strt_d
  213.     bclr    #MFRNB_SERIAL,mfrn_Flags(a3)
  214. strt_d    tst.l    60(a0)
  215.     beq    strt_e
  216.     bset    #MFRNB_NOBELLS,mfrn_Flags(a3)
  217. strt_e    tst.l    64(a0)
  218.     beq    strt_b
  219.     bclr    #MFRNB_NOBELLS,mfrn_Flags(a3)
  220. strt_b    tst.l    (a0)+
  221.     bne    f_Info
  222.     tst.l    (a0)+
  223.     bne    f_Install
  224.     tst.l    (a0)+
  225.     bne    f_Clear
  226.     tst.l    (a0)+
  227.     bne    f_Remove
  228.     tst.l    (a0)+
  229.     bne    f_Type
  230.     tst.l    (a0)+
  231.     bne    f_Write
  232.     tst.l    (a0)
  233.     bne    QuitOk
  234.     lea    NoCommand(pc),a0
  235.     bra    QuitStrErr
  236. f_Info    tst.l    MFNode
  237.     beq    NotInstalled
  238.     move.l    MFNode(pc),a2
  239.     lea    InfoFormat(pc),a0
  240.     move.l    a0,d2
  241.     move.l    MyOutput(pc),d1
  242.     lea    InfoFormatArgs(pc),a0
  243.     move.l    a0,d3
  244.     move.l    mfrn_BufferSize(a2),d0
  245.     move.l    d0,(a0)+
  246.     lea    NoTraceT(pc),a1
  247.     move.l    a1,(a0)+
  248.     btst    #MFRNB_TRACE,mfrn_Flags(a2)
  249.     beq    finf_0
  250.     addq.l    #2,-4(a0)
  251. finf_0    lea    NoSerialT(pc),a1
  252.     move.l    a1,(a0)+
  253.     btst    #MFRNB_SERIAL,mfrn_Flags(a2)
  254.     beq    finf_1
  255.     addq.l    #2,-4(a0)
  256. finf_1    lea    NoFlashT(pc),a1
  257.     move.l    a1,(a0)+
  258.     btst    #MFRNB_FLASH,mfrn_Flags(a2)
  259.     beq    finf_2
  260.     addq.l    #2,-4(a0)
  261. finf_2    lea    NoBellsT(pc),a1
  262.     move.l    a1,(a0)+
  263.     btst    #MFRNB_NOBELLS,mfrn_Flags(a2)
  264.     bne    finf_3
  265.     lea    BellsT(pc),a1
  266.     move.l    a1,(a0)+
  267. finf_3    move.l    mfrn_CharsInBuff(a2),CharsInBuffSpace
  268.     CALLDOS    VFPrintf
  269.     bra    QuitOk
  270. f_Clear    tst.l    MFNode
  271.     beq    NotInstalled
  272.     move.l    MFNode(pc),a2
  273.     clr.l    mfrn_CharsInBuff(a2)
  274.     bclr    #MFRNB_OVERFLOW,mfrn_Flags(a2)
  275.     bra    QuitOk
  276. f_Remove
  277.     tst.l    MFNode
  278.     beq    NotInstalled
  279.     move.l    MFNode(pc),a2
  280.     movea.l    4.w,a6
  281.     btst    #MFRNB_PATCHED,mfrn_Flags(a2)
  282.     beq    frem_3
  283.     lea    _LVORawPutChar,a0
  284.     move.l    mfrn_OldVector(a2),d0
  285.     move.l    a6,a1
  286.     JSRL    Disable
  287.     JSRL    SetFunction
  288.     lea    mfrn_PatchProc(a2),a0
  289.     cmp.l    a0,d0
  290.     beq    frem_3
  291.     move.l    a6,a1
  292.     lea    _LVORawPutChar,a0
  293.     JSRL    SetFunction
  294.     JSRL    Enable
  295.     lea    CantQuitTxt(pc),a0
  296.     bra    QuitStrErr
  297. frem_3    JSRL    Enable
  298.     move.l    MFNode(pc),a0
  299.     JSRL    Forbid
  300.     lea    KickTagPtr(a6),a2
  301. frem_0    move.l    (a2),a1
  302.     move.l    a1,d0
  303.     beq    frem_1
  304.     cmpa.l    a0,a1
  305.     beq    frem_2
  306.     lea    4(a1),a2
  307.     bra    frem_0
  308. frem_2    move.l    4(a0),(a2)
  309. frem_1    lea    KickMemPtr(a6),a2
  310.     move.l    MFNode(pc),a0
  311.     lea    mfrn_Node(a0),a0
  312. 1$    move.l    (a2),a1
  313.     move.l    a1,d0
  314.     beq    2$
  315.     cmpa.l    a0,a1
  316.     beq    3$
  317.     move.l    (a2),a2
  318.     bra    1$
  319. 3$    move.l    (a0),(a2)
  320. 2$    JSRL    SumKickData
  321.     move.l    d0,KickCheckSum(a6)
  322.     JSRL    CacheClearU
  323.     JSRL    Permit
  324.     move.l    MFNode(pc),a0
  325.     bsr    FreeResNode
  326.     bra    QuitOk
  327. NoMemory
  328.     lea    NoMemoryTxt(pc),a0
  329.     bra    QuitStrErr
  330. NoBuffSize
  331.     lea    NoBuffSizeTxt(pc),a0
  332.     bra    QuitStrErr
  333. f_Install
  334.     tst.l    MFNode
  335.     bne    AlreadyInstalled
  336.     move.l    28(a2),d0
  337.     beq    NoBuffSize
  338.     move.l    28(a2),a0
  339.     move.l    (a0),d0
  340.     cmpi.l    #10239,d0
  341.     bhi    1$
  342.     lea    Using10KBTxt(pc),a0
  343.     bsr    PrintString
  344.     move.l    #10240,d0
  345. 1$    bsr    CreateNode
  346.     tst.l    d0
  347.     beq    NoMemory
  348.     move.l    d0,a3
  349.     move.l    d0,MFNode
  350.     tst.l    44(a2)
  351.     beq    finst_0
  352.     bset    #MFRNB_SERIAL,mfrn_Flags(a3)
  353. finst_0    tst.l    36(a2)
  354.     beq    finst_1
  355.     bset    #MFRNB_FLASH,mfrn_Flags(a3)
  356. finst_1    tst.l    52(a2)
  357.     beq    finst_2
  358.     bset    #MFRNB_TRACE,mfrn_Flags(a3)
  359.     bset    #MFRNB_PATCHED,mfrn_Flags(a3)
  360.     movea.l    4.w,a6
  361.     lea    _LVORawPutChar,a0
  362.     lea    mfrn_PatchProc(a3),a1
  363.     move.l    a1,d0
  364.     move.l    a6,a1
  365.     JSRL    SetFunction
  366.     move.l    d0,mfrn_OldVector(a3)
  367. finst_2    tst.l    60(a2)
  368.     beq    finst_3
  369.     bset    #MFRNB_NOBELLS,mfrn_Flags(a3)
  370. finst_3    movea.l    4.w,a6
  371.     JSRL    Forbid
  372.     JSRL    Disable
  373.     move.l    KickTagPtr(a6),mfrn_Succ(a3)
  374.     move.l    a3,KickTagPtr(a6)
  375.     move.l    KickMemPtr(a6),mfrn_Node(a3)
  376.     lea    mfrn_MemList(a3),a0
  377.     move.l    a0,KickMemPtr(a6)
  378.     JSRL    Enable
  379.     JSRL    SumKickData
  380.     move.l    d0,KickCheckSum(a6)
  381.     JSRL    Permit
  382.     bra    QuitOk
  383. AlreadyInstalled
  384.     lea    AlreadyInstalledTxt(pc),a0
  385.     bsr    PrintString
  386.     bra    QuitOk
  387. NotInstalled
  388.     lea    NotInstalledTxt(pc),a0
  389.     bsr    PrintString
  390. QuitOk    bsr    Quit
  391.     moveq    #RETURN_OK,d0
  392.     rts
  393. PrintString    * (string)(a0)
  394.     move.l    a6,-(sp)
  395.     move.l    a0,d1
  396.     CALLDOS    PutStr
  397.     move.l    (sp)+,a6
  398.     rts
  399. FindResNode    * () -> resnode/NULL
  400.     movem.l    a2/a6,-(sp)
  401.     CALLEXEC    Forbid
  402.     move.l    KickTagPtr(a6),a0
  403. frn_3    move.l    a0,d0
  404.     beq    frn_ex
  405. frn_0    move.l    (a0),a1
  406.     move.l    RT_NAME(a1),a1
  407.     lea    MyNameString(pc),a2
  408. frn_1    move.b    (a1)+,d0
  409.     cmp.b    (a2)+,d0
  410.     bne    frn_2
  411.     tst.b    d0
  412.     bne    frn_1
  413.     move.l    a0,d0
  414.     JSRL    Permit
  415.     movem.l    (sp)+,a2/a6
  416.     rts
  417. frn_ex    JSRL    Permit
  418.     moveq    #0,d0
  419.     movem.l    (sp)+,a2/a6
  420.     rts
  421. frn_2    move.l    4(a0),a0
  422.     bra    frn_3
  423. FreeResNode    * (node)(a0)
  424.     move.l    a6,-(sp)
  425.     move.l    mfrn_NodeSize(a0),d0
  426.     move.l    a0,a1
  427.     CALLEXEC    FreeMem
  428.     move.l    (sp)+,a6
  429.     rts
  430. crn_failed
  431.     movem.l    (sp)+,d2/a2/a3/a6
  432.     rts
  433. CreateNode    * (buffsize)(d0) -> node
  434.     movem.l    d2/a2/a3/a6,-(sp)
  435.     move.l    d0,d2
  436.     move.l    #MEMF_KICK!MEMF_PUBLIC!MEMF_CLEAR!MEMF_LOCAL,d1
  437.     add.l    #mfrn_SIZEOF,d0
  438.     move.l    d0,-(sp)
  439.     CALLEXEC    AllocMem
  440.     move.l    (sp)+,d1
  441.     tst.l    d0
  442.     beq    crn_failed
  443.     move.l    d0,a2
  444.     move.l    d0,mfrn_NodePtr(a2)
  445.     move.l    d1,mfrn_NodeSize(a2)
  446.     move.l    d2,mfrn_BufferSize(a2)
  447.     lea    mfrn_Resident(a2),a1
  448.     move.l    a1,mfrn_MyResident(a2)
  449.     move.w    #RTC_MATCHWORD,RT_MATCHWORD(a1)
  450.     move.b    #0,RT_PRI(a1)
  451.     move.l    a1,RT_MATCHTAG(a1)
  452.     move.b    #RTF_COLDSTART,RT_FLAGS(a1)
  453.     move.b    #MYVERSION,RT_VERSION(a1)
  454.     lea    MyNameString(pc),a0
  455.     lea    mfrn_NameString(a2),a3
  456.     move.l    a3,RT_NAME(a1)
  457. 1$    move.b    (a0)+,(a3)+
  458.     bne    1$
  459.     lea    MyIDString(pc),a0
  460.     lea    mfrn_IDString(a2),a3
  461.     move.l    a3,RT_IDSTRING(a1)
  462. 2$    move.b    (a0)+,(a3)+
  463.     bne    2$
  464.     lea    MyPatchProc(pc),a0
  465.     lea    mfrn_PatchProc(a2),a3
  466.     move.l    #MyPatchProcE-MyPatchProc-1,d0
  467. 3$    move.b    (a0)+,(a3)+
  468.     dbf    d0,3$
  469.     lea    MyInitProc(pc),a0
  470.     lea    mfrn_InitProc(a2),a3
  471.     move.l    a3,RT_INIT(a1)
  472.     move.l    #MyInitProcE-MyInitProc-1,d0
  473. 4$    move.b    (a0)+,(a3)+
  474.     dbf    d0,4$
  475.     move.w    #1,mfrn_NumEntries(a2)
  476.     move.l    a2,d0
  477.     movem.l    (sp)+,d2/a2/a3/a6
  478.     rts
  479. f_Type    tst.l    MFNode
  480.     beq    NotInstalled
  481.     move.l    MyOutput(pc),d2
  482.     bsr    DoType
  483.     moveq    #LF,d2
  484.     move.l    MyOutput(pc),d1
  485.     CALLDOS    FPutC
  486.     move.l    MFNode(pc),a2
  487.     btst    #MFRNB_OVERFLOW,mfrn_Flags(a2)
  488.     beq    QuitOk
  489.     lea    BuffOverflow(pc),a0
  490.     bsr    PrintString
  491.     bra    QuitOk
  492. BadFileName
  493.     lea    BadFileNameTxt(pc),a0
  494.     bra    QuitStrErr
  495. f_Write
  496.     move.l    32(a2),d0
  497.     beq    BadFileName
  498.     move.l    d0,d1
  499.     move.l    #MODE_NEWFILE,d2
  500.     CALLDOS    Open
  501.     move.l    d0,d7
  502.     bne    fwrt_0
  503.     CALLDOS    IoErr
  504.     move.l    d0,d1
  505.     moveq    #0,d2
  506.     CALLDOS    PrintFault
  507.     bra    QuitErr
  508. fwrt_0    move.l    d7,d2
  509.     bsr    DoType
  510.     tst.l    d0
  511.     bne    fwrt_1
  512.     move.l    MFNode(pc),a2
  513.     btst    #MFRNB_OVERFLOW,mfrn_Flags(a2)
  514.     beq    fwrt_1
  515.     lea    BuffOverflow(pc),a0
  516.     move.l    d7,d1
  517.     move.l    a0,d2
  518.     CALLDOS    FPuts
  519.     tst.l    d0
  520.     beq    fwrt_1
  521.     JSRL    IoErr
  522.     move.l    d0,d1
  523.     moveq    #0,d2
  524.     JSRL    PrintFault
  525.     bra    fwrt_2
  526. fwrt_1    move.l    d7,d1
  527.     CALLDOS    Close
  528.     bra    QuitOk
  529. fwrt_2    move.l    d7,d1
  530.     CALLDOS    Close
  531.     move.l    32+MyArgTable,d1
  532.     JSRL    DeleteFile
  533.     bra    QuitErr
  534. DoType    *    (d2-fh)
  535.     movem.l    d1-d7,-(sp)
  536.     move.l    d2,d7    ; fh
  537.     moveq    #20,d6    ; 20 bytes a time
  538.     move.l    MFNode(pc),a0
  539.     lea    mfrn_Buffer(a0),a1
  540.     move.l    a1,d5    ; buffer
  541.     move.l    mfrn_CharsInBuff(a0),d4    ; len
  542.     addq.l    #4,d5    ; let's skip some private data...
  543. 1$    tst.l    d4
  544.     beq    3$
  545.     cmp.l    d6,d4
  546.     bge    2$
  547.     move.l    d4,d6
  548. 2$    move.l    #SIGBREAKF_CTRL_C,d1
  549.     CALLDOS    CheckSignal
  550.     tst.l    d0
  551.     bne    4$
  552.     move.l    d7,d1
  553.     move.l    d5,d2
  554.     move.l    d6,d3
  555.     sub.l    d6,d4
  556.     add.l    d6,d5
  557.     move.l    d4,-(sp)
  558.     moveq    #1,d4
  559.     CALLDOS    FWrite
  560.     move.l    (sp)+,d4
  561.     subq.l    #1,d0
  562.     beq    1$
  563.     JSRL    IoErr
  564.     move.l    d0,d1
  565.     moveq    #0,d2
  566.     JSRL    PrintFault
  567.     moveq    #-1,d0
  568.     movem.l    (sp)+,d1-d7
  569.     rts
  570. 3$    moveq    #0,d0
  571.     movem.l    (sp)+,d1-d7
  572.     rts
  573. 4$    lea    BreakTxt(pc),a0
  574.     bsr    PrintString
  575.     movem.l    (sp)+,d1-d7
  576.     moveq    #-2,d0
  577.     rts
  578. BreakTxt
  579.     dc.b    '*** Break',LF,0
  580.     even
  581. MyPatchProc
  582.     lea    MyPatchProc-mfrn_PatchProc(pc),a0
  583.     btst    #MFRNB_TRACE,mfrn_Flags(a0)
  584.     beq    mppr_0
  585.     btst    #MFRNB_NOBELLS,mfrn_Flags(a0)
  586.     beq    mppr_5
  587.     cmpi.b    #BELL,d0
  588.     beq    mppr_0
  589. mppr_5    move.l    mfrn_CharsInBuff(a0),d1
  590.     move.l    d2,-(sp)
  591.     move.l    mfrn_BufferSize(a0),d2
  592.     subi.l    #4,d2
  593.     cmp.l    d1,d2
  594.     beq    mppr_4
  595.     addq.l    #1,mfrn_CharsInBuff(a0)
  596.     lea    mfrn_Buffer(a0),a1
  597.     move.b    d0,4(a1,d1.l)
  598. mppr_1    move.l    (sp)+,d2
  599. mppr_0    btst    #MFRNB_FLASH,mfrn_Flags(a0)
  600.     beq    mppr_2
  601.     lea    $dff000,a1
  602.     move.w    vhposr(a1),color(a1)
  603. mppr_2    btst    #MFRNB_SERIAL,mfrn_Flags(a0)
  604.     beq    mppr_3
  605.     move.l    mfrn_OldVector(a0),a0
  606.     jmp    (a0)
  607. mppr_3    rts
  608. mppr_4    bset    #MFRNB_OVERFLOW,mfrn_Flags(a0)
  609.     bra    mppr_1
  610. MyPatchProcE
  611. MyInitProc
  612.     lea    MyInitProc-mfrn_InitProc(pc),a0
  613.     andi.b    #~(MFRNF_PATCHED!MFRNF_TRACE),mfrn_Flags(a0)
  614. NullExit
  615.     moveq    #0,d0
  616. Exit    rts
  617. MyInitProcE
  618.  
  619. ****************************************************************************
  620.  
  621. MFNode    dc.l    0
  622. _DOSBase
  623.     dc.l    0
  624. MyInput    dc.l    0
  625. MyOutput
  626.     dc.l    0
  627. ArgPtr    dc.l    0
  628. InfoFormatArgs
  629.     dc.l    0,0,0,0,0
  630. CharsInBuffSpace
  631.     dc.l    0
  632. DosLibName
  633.     DOSNAME
  634. MyNameString
  635.     dc.b    'MungFriend',0
  636.     even
  637.     dc.b    '$VER: '
  638. MyIDString
  639.     dc.b    'MungFriend 3.1  (24.01.97) © 1996 Szymon Pura',CR,LF,0
  640. MyTemplate
  641.     dc.b    'INFO=I/S,INSTALL=S/S,CLEAR=C/S,REMOVE=R/S,TYPE=T/S,WRITE=W/S,UPDATE=U/S,SIZE/N/K,TO,FLASH/S,NOFLASH/S,SERIAL/S,NOSERIAL/S,TRACE/S,NOTRACE/S,NOBELLS/S,BELLS/S',0
  642. BuffOverflow
  643.     dc.b    '*** WARNING: BUFFER OVERFLOW ***',LF,0
  644. TooManyCommands
  645.     dc.b    'Bad args - only ONE command allowed',LF,0
  646. FlagErrorTxt
  647.     dc.b    'Bad args - flags are mutual exclusive',LF,0
  648. NoCommand
  649.     dc.b    ESC,'[32mMungFriend 3.1',ESC,'[31m   © 1995-97 Szymon Pura, FREEWARE',LF
  650.     dc.b    'USAGE:',LF
  651.     dc.b    '    MungFriend INFO|INSTALL|CLEAR|REMOVE|TYPE|WRITE|UPDATE [SIZE n]',LF
  652.     dc.b    '               [TO filespec] [FLASH|NOFLASH][TRACE|NOTRACE][SERIAL|NOSERIAL]',LF
  653.     dc.b    '               [BELLS|NOBELLS]',LF,LF
  654.     dc.b    '    MungFriend [<command> [<args>] [<options>]]',LF,LF
  655.     dc.b    '           Where <command> is one of:',LF
  656.     dc.b    '   - info             - display some general info about current buffer',LF
  657.     dc.b    '   - install size <n> - create a new buffer (size in bytes)',LF
  658.     dc.b    '   - remove           - remove current buffer',LF
  659.     dc.b    '   - type             - type buffer contents',LF
  660.     dc.b    '   - write <filename> - write buffer contents to a file',LF
  661.     dc.b    '   - update           - update options,',LF
  662.     dc.b    '           And <options> are:',LF
  663.     dc.b    '   - serial           - allow serial output',LF
  664.     dc.b    '   - trace            - turn on exec/RawDoFmt() tracing',LF
  665.     dc.b    '   - flash            - turn on flash mode',LF
  666.     dc.b    '   - bells            - allow console bells',LF,LF,0
  667. NotInstalledTxt
  668.     dc.b    'MungFriend is not installed !',LF,0
  669. InfoFormat
  670.     dc.b    'BuffSize: %ld  Options: %s  %s  %s  %s',LF
  671.     dc.b    'Characters in buffer: %ld',LF,0
  672. NoTraceT
  673.     dc.b    'NOTRACE',0
  674. NoFlashT
  675.     dc.b    'NOFLASH',0
  676. NoSerialT
  677.     dc.b    'NOSERIAL',0
  678. NoBellsT
  679.     dc.b    'NOBELLS',0
  680. BellsT    dc.b    'BELLS',0
  681. CantQuitTxt
  682.     dc.b    "Can't quit !!  Someone is using RawPutChar() vector !!",LF,0
  683. AlreadyInstalledTxt
  684.     dc.b    'MungFriend is already installed !!',LF,0
  685. NoMemoryTxt
  686.     dc.b    'Not enough memory',LF,0
  687. NoBuffSizeTxt
  688.     dc.b    'Bad args - no buffer size',LF,0
  689. BadFileNameTxt
  690.     dc.b    'Bad args - filespec required',LF,0
  691. Using10KBTxt
  692.     dc.b    'Allocated buffer: 10 KB',LF,0
  693.     section    "args",BSS
  694. MyArgTable
  695.     ds.b    68
  696.